package JavaSE.Grammar;

/**
 * 不定长参数
 *
 * 使用可变长参数的注意事项
 * 1.每个方法最多只能有一个可变长参数，这个可变长参数应该是作为最后一个参数存在
 * 2.在方法体中，可变长参数实际上是一个数组
 */
public class VariableLengthParameter {
    /**
     * 定长参数，此时只能传输一个参数进入该方法
     * @param i
     * @return
     */
    public static int method(int i){
        return 0;
    }

    /**
     * 定长参数，此时只能传输两个参数进入该方法
     * @param i
     * @param j
     * @return
     */
    public static int method(int i,int j){
        return 0;
    }


    public static void main1(String[] args) {
        method(1);
        method(1,2);
//        method(1,2,3);//此时，该调用会出现错误
    }

    /**
     * 此时，通过使用int...i从而实现一个可变长参数
     * 他的本质实际上是一个数组
     * 此时，可以输入长度不同的值进入，并且不会报错
     * @param j
     * @return
     */
    public static int method(int...j){
        return 0;
    }

    public static void main2(String[] args) {
//        method(1,2,3,4);//此时调用该方法并不会出现错误
    }

    /**
     * 但是在上述的基础上，我再在不定长参数前，加入一个与不定长参数类型相同的参数
     * 此时，两个包含不定长参数的方法均存在在类中
     * 再在main方法中调用该方法，此时会出现报错，因为无法确认具体调用的哪个方法
     * @param i
     * @param j
     * @return
     */
    public static int method(int i,int...j){
        return 0;
    }

    public static void main3(String[] args) {
//        method(1,2,3,4);//在加入了上面的方法体后，此时再在main方法中调用会出现报错
    }

    /**
     * 但是在上述的基础上，我再在不定长参数前，加入一个与不定长参数类型不同的参数
     * 此时，如果调用下列方法，因为可以明确确定具体方法，所以不会出现报错
     * @param i
     * @param j
     * @return
     */
    public static int method(String i,int...j){
        System.out.println(j.length);
        return 0;
    }

    public static void main(String[] args) {
        method("1",2,3,4);//此时该方法的调用不会出现上述错误,此时执行结果会打印3
        method("1",2,3);//此时执行结果会打印2
    }
}
